/**
 * @copyright Copyright (c) 2023..
 *
 * @file    parse_proto.h
 * @brief   描述 解析proto规则
 * @author  HC(202206728@any3.com)
 * @version 1.0
 * @date    2023-09-27
 */
#ifndef PARSE_PROTO_H
#define PARSE_PROTO_H

#include <functional>
#include <map>

#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/descriptor.pb.h>
#include <google/protobuf/dynamic_message.h>
#include <google/protobuf/compiler/importer.h>

#include "public_define.h"

using namespace google::protobuf;
using namespace ::google::protobuf::compiler;
using namespace ::google::protobuf;

namespace DcAdr
{
    class ParseProto
    {
    public:
        ParseProto(/* args */);
        ~ParseProto();

        //初始化
        void initProto();
        //通过topic获取对应的message解析器
        google::protobuf::Message *getProtoMessageByTopic(std::string &topic);
        //过滤部分topic
        bool protoRuleContainTopic(const std::string &topic);

        //解析proto引擎规则
        bool parseTriggerConfigJsonData(const std::string &path);
        //解析信号规则
        bool parseSignalConfigJsonData(const std::string &path);

    private:
        //动态解析proto文件
        int dynamicParseFromPBFile(const std::string &classname, ::google::protobuf::Message *&msg);

        //解析信号规则
        std::shared_ptr<ProtoCondRule_t> parseRuleInfo(const Json::Value &jsons, const std::string &eventID);
        //解析需要采集的规则
        void parseCollectData(const Json::Value &jsons, vector<std::string>& outVec);
		std::vector<std::string> parseCollectData(const Json::Value &jsons);
        void addElementsToVec(const std::vector<std::string> &srcVec, std::vector<std::string> &desVec);

        //解析条件采集规则
        bool parseCondRuleJson(const Json::Value &value);
        //解析信号采集规则
        bool parseSignalCollect(const Json::Value &value);

    public:
        //因为数据源来的是topic，所以以topic为键，保存对于事件，这样减少循环判断次数，格式为<topic,vector<事件id>>
        std::map<std::string, std::vector<std::string>> m_topicEventIDList;
        //规则引擎列表<事件ID，规则>
        std::map<std::string, std::shared_ptr<ProtoCondInfo_t>> m_protoRuleList;
        //信号采集解析规则
        std::map<std::string, std::vector<ProtoCondRuleSignalInfo_t>> m_protoSignalParser;

    private:
        //动态加息proto导入器和msg工厂
        Importer *m_importer = NULL;
        DynamicMessageFactory *m_factory = NULL;
        //存对应topic的解析器
        std::map<std::string, Message *> m_protoMessage;
    };
}

#endif // PARSE_PROTO_H